"""Python 装饰允许在不修改原有函数代码的基础上，动态地增加或修改函数的功能，
装饰器本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。"""

def my_decorator(func):
    def wrapper():
        print("Before the function call")#增加新功能，不影响被装饰函数本身
        func()#调用被装饰的函数
        print("After the function call")
    return wrapper

@my_decorator#使用装饰器
def say_hello():#无参函数
    print("hello!")

say_hello()
#处理带参数的函数
#它接受一个函数 func 作为参数，并返回一个内部函数 wrapper，
#在 wrapper 函数内部，你可以执行一些额外的操作，然后调用原始函数 func，并返回其结果。
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):#循环n次，不用设置变量，用 _ 指代临时变量，只在这个语句中使用一次。
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(3)
def greet(name):
    print(f"Hello, {name}!")
# repeat 函数接受一个整数参数 n，然后返回一个装饰器函数。该装饰器函数内部定义了 wrapper 函数，在调用原始函数之前重复执行 n 次。
# greet 函数在被 @repeat(3) 装饰后，会打印三次问候语。
greet("Bill")
